package com.r_z.util;

import org.apache.commons.lang3.StringUtils;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author 任俊杰
 * @version 1.0
 * @date 2023/5/29
 */
public class CreateIDUtil {
    /**
     * 创建序号
     * <p>
     * 可用来凭借0的数量，即将int拼接为001 0001 00001
     * 会自动对传入的数值进行+1操作
     *
     * @param splicingStr 需要加工的数值
     * @param numLength   字符串的长度
     * @return String 拼接好的001字符串
     */
    private static String createSerial(String splicingStr, int numLength) {
        long splicingNum = Long.parseLong(splicingStr);
        splicingNum += 1;
        //重新将编号转换为String类型
        String str = String.valueOf(splicingNum);
        //获得字符串长度，因为编号的拼接在最后是四个字符
        int strLength = str.length();
        //用来拼接”0“
        StringBuilder lastStr = new StringBuilder();
        //如果长度不满足
        if (strLength < numLength) {
            //判断还差几个0，便循环添加几个
            for (int i = 0; i < numLength - strLength; i++) {
                lastStr.append("0");
            }
        }
        lastStr.append(str);
        return lastStr.toString();
    }

    /**
     * 通过传入的id自动截取首字符的方法
     *
     * @param str 需要获取首字符的表id
     * @return String 截取到表id的首字符
     */
    private static StringBuilder getFirstStr(String str) {
        StringBuilder stringBuilder = new StringBuilder();
        String[] split = str.split("");
        for (int i = 0; i < split.length; i++) {
            boolean numeric = StringUtils.isNumeric(split[i]);
            if (numeric) {
                String substring = str.substring(0, i);
                stringBuilder.append(substring);
                return stringBuilder;
            }
        }
        return stringBuilder;
    }


    /**
     * 给表创建新增id，包含时间
     *
     * @param id       数据库拿到的最新id
     * @param firstStr 表id首字符
     * @return String 创建好的**表ID
     */
    public static String createId(String id, String firstStr) {
        //得到首字母字符串的StringBuilder对象
        StringBuilder stringBuilder = new StringBuilder();
//        int index = -1;
        //如果首字符没有数据
        if (stringBuilder.length() == 0) {
            //则以形参中传过来的数据为主
            stringBuilder = new StringBuilder(firstStr);
        } else {
            stringBuilder = getFirstStr(id);
        }
        //创建时间类
        Date currDate = new Date();
        //格式化时间
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
        //对当前时间执行格式化
        String date = simpleDateFormat.format(currDate);
        //如果最大id为null，则设置一个初始值，防止报空指针
        if(id==null) {
            id="";
        }
        //获取当前时间首次出现的位置
        int index = id.indexOf(date);
        //如果当天的数据是最新的一单
        if (index == -1) {
            //直接在格式化好的时间格式后面拼接001编号
            date += "0001";
            //直接返回最新的数据
            return stringBuilder.append(date).toString();
        } else {
            //因为这一单不是今天最新的一单，时间格式为（yyyyMMdd）8位，所以需要+8
            index += date.length();
            //通过索引获取当天最新的编号
            String substring = id.substring(index);
            //将今天的时间拼接到id中,因为stringBuilder在初始化的时候只拿到首字母，并没有时间
            stringBuilder.append(date);
            /*
                需要拼接0的数量
                数量=(传入id的数量-以拼接字符长度)
                以拼接字符=首字母+日期格式
             */
            int zeroNum = id.length() - stringBuilder.length();
            //调用拼接0的方法
            String lastStr = createSerial(substring, zeroNum);
            //将拼接好的0存入到stringBuilder对象中
            stringBuilder.append(lastStr);
            return stringBuilder.toString();
        }
    }

    /**
     * id自增长，无时间字符串
     *
     * @param currMaxBrokersId 当前最大的id
     * @param firstStr         表id首字符
     * @return String 表ID
     */
    public static String createIdNoTime(String currMaxBrokersId, String firstStr) {
        //设置首字符
        StringBuilder stringBuilder = new StringBuilder();
        ;
        //如果首字符没有数据
        if (stringBuilder.length() == 0) {
            //则以形参中传过来的数据为主
            stringBuilder = new StringBuilder(firstStr);
        } else {
            stringBuilder = getFirstStr(currMaxBrokersId);
        }
        //开头字母的长度
        int firstStrLength = stringBuilder.toString().length();
        /*
        声明初始值
        初始编号
         */
        String id = "0";
        //编号初始长度
        int zeroNum = 4;
        if (currMaxBrokersId != null && !"".equals(currMaxBrokersId)) {
            //获取开头字母以后的编号
            id = currMaxBrokersId.substring(firstStrLength);
            //需要拼接0的数量 数量=总长度-开头字母长度
            zeroNum = currMaxBrokersId.length() - firstStrLength;
        }
        //创建序号 执行0的拼接
        String newId = createSerial(id, zeroNum);
        //
        stringBuilder.append(newId);
        return stringBuilder.toString();
    }

    public static void main(String[] args) {
     //System.out.println(createId("","aa"));
    }
}
